const Event = require('./event');
function wCorePage(config) {
  
  const { wCore } = getApp();
  const { onShow: _onShow, onHide: _onHide, onLoad: _onLoad, onUnload: _onUnload, initData = [], watchData = {}, add:_add } = config;
  let {data = {} } = config;

  // _________________start 给page对象公共方法___________________________________
  //给当前 page 增加公共方法, 可以用 this 方式调用
  // 在 page 页，可以直接 this.dispatch()调用
  function dispatch(funParam, isCache = 0) {
    wCore.dispatch(funParam, isCache);
  }
  // 在 page 页，可以直接 this.getState()调用
  function getState(objState = [], objParam = { remote: false }) {
    return wCore.getState(objState, objParam);
  }
  // __________________end_________________________________________________


  // ___________________start 给page对象添加属性_________________________________
  // 给当前页面增加默认属性 initData, watchData
  function doInitData() {
    return getState(initData);
  }
  const newData = doInitData();
  data = {...data, ...newData};
  console.log('new data:', data);
  /**
   * 监听数据，当切回到当前页面时，需要对比下数据是否有变化，如果
   * 有变化则更新数据，如果没有变化则不动
   * @param {string} pkey - 有更新的属性
   **/ 
  function doWatchData(pkey = '') {
    if (pkey) {
      console.log("触发 page 订阅，显示要修改的属性", pkey, this);
    }
    const newData = getState();
    const keys = Object.keys(newData);
    //如果有指定要更新的 key，则只有当这个 key 被触发了时，才执行比对更新
    if (pkey != '' && keys.indexOf(pkey) == 0) { 
      // 对比新旧数据
      if (JSON.stringify(newData[pkey]) !== JSON.stringify(data[pkey])) {
        watchData[pkey].call(this, newData[pkey]);
      } else {
        console.log("单个数据触发，数据相等");
      }
    } else { // 否则只要有一个更新，就全部更新监听的属性
      for ( const key in watchData) {
        if (keys.indexOf(key) == 0) { //存在
          // 对比新旧数据
          if (JSON.stringify(newData[key]) !== JSON.stringify(data[key])) {
            watchData[key].call(this, newData[key]);
          } else {
            console.log("数据相等");
          }
        }
      }
    }
  }
  // ___________________end________________________________________________


  
  // ___________________start 给page对象添加生命周期函数____________________________________
  // 给当前页面增加add的生命周期
  if (typeof _add === 'function') { // 这里是测试增加生命周期函数
    //_add.call(this);
  }

  // ___________________end________________________________________________
  
  // 重定义 onLoad
  function onLoad(options) {
    console.log("执行 onload");
    if (typeof _onLoad === 'function') {
      _onLoad.call(this, options);
    }
  }

  // 重定义 onUnload
  function onUnload() {
    if (typeof _onUnload === 'function') {
      _onUnload.call(this);
    }
  }

  // 重定义 onShow
  function onShow(options) {
    if (typeof watchData === 'object') {
      console.log("执行属性监听");
      doWatchData();
      // 添加订阅, 相应当前界面上被监听的属性变化时，变化
      wCore.event.on('watchDataAtt', doWatchData.bind(this));
    }
    if (typeof _onShow === 'function') {
      _onShow.call(this, options);
    }
  }

  // 重定义 onHide
  function onHide() {
    if (typeof _onHide === 'function') {
      _onHide.call(this);
    }
  }

  return  Page({
    ...config,
    data,
    onShow,
    onHide,
    onLoad,
    onUnload,
    dispatch,
    getState
  });
}

module.exports = wCorePage;
